home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / smailsrc.zip / UUPC.ZIP / NDIR.C < prev    next >
Text File  |  1990-04-04  |  2KB  |  129 lines

  1. /*
  2.     ndir.c for MS-DOS by Samuel Lam <skl@van-bc.UUCP>, June/87
  3. */
  4.  
  5. /*
  6.    Berkeley-style directory reading routine on MS-DOS
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #include <string.h>
  12. #include <alloc.h>
  13. #include <dos.h>
  14. #include <stdlib.h>
  15. #include <assert.h>
  16.  
  17. #include "ndir.h"
  18.  
  19. /*
  20.    Open a directory
  21. */
  22.  
  23. DIR *opendir(dirname)
  24. char *dirname;
  25. {
  26.     union REGS inregs, outregs;
  27.     struct SREGS segregs;
  28.     char pathname[128];
  29.     DTA far *dtaptr;
  30.     char far *pathptr;
  31.     DIR *dirp;
  32.  
  33.     /* build pathname to be scanned */
  34.     strcpy(pathname, dirname);
  35.     strcat(pathname, "/*.*");
  36.  
  37.     /* allocate control block */
  38.     dirp = malloc(sizeof(DIR));
  39.  
  40.     /* set DTA address to our buffer */
  41.     inregs.h.ah = 0x1a;
  42.     dtaptr = (DTA far *)&(dirp->dirdta);
  43.     segregs.ds = FP_SEG(dtaptr);
  44.     inregs.x.dx = FP_OFF(dtaptr);
  45.     intdosx(&inregs, &outregs, &segregs);
  46.  
  47.     /* look for the first file */
  48.     inregs.h.ah = 0x4e;
  49.     pathptr = (char far *)pathname;
  50.     segregs.ds = FP_SEG(pathptr);
  51.     inregs.x.dx = FP_OFF(pathptr);
  52.     inregs.x.cx = 0;   /* attribute */
  53.     intdosx(&inregs, &outregs, &segregs);
  54.  
  55.     /* bad directory name? */
  56.     if (outregs.x.cflag && (outregs.x.ax == 2 || outregs.x.ax == 3)) {
  57.         free(dirp);
  58.         return NULL;
  59.     }
  60.  
  61.     dirp->dirfirst = outregs.x.cflag ? outregs.x.ax : 0;
  62.  
  63.     strcpy(dirp->dirid, "DIR");
  64.  
  65.     return dirp;
  66.  
  67. } /*opendir*/
  68.  
  69.  
  70. /*
  71.    Get next entry in a directory
  72. */
  73.  
  74. struct direct *readdir(dirp)
  75. DIR *dirp;
  76. {
  77.     int errcode;
  78.  
  79.     assert(strcmp(dirp->dirid, "DIR") == 0);
  80.  
  81.     if (dirp->dirfirst == -1) {
  82.         union REGS inregs, outregs;
  83.         struct SREGS segregs;
  84.         DTA far *dtaptr;
  85.  
  86.         inregs.h.ah = 0x4f;
  87.         dtaptr = (DTA far *)&(dirp->dirdta);
  88.         segregs.ds = FP_SEG(dtaptr);
  89.         inregs.x.dx = FP_OFF(dtaptr);
  90.         intdosx(&inregs, &outregs, &segregs);
  91.         errcode = outregs.x.cflag ? outregs.x.ax : 0;
  92.  
  93.     } else {
  94.  
  95.         errcode = dirp->dirfirst;
  96.         dirp->dirfirst = -1;
  97.  
  98.     };
  99.  
  100.     /* no more files in directory? */
  101.     if (errcode == 18)
  102.         return NULL;
  103.     assert(errcode == 0);
  104.  
  105.     dirp->dirent.d_ino = -1;   /* no inode information */
  106.     strlwr(strcpy(dirp->dirent.d_name, dirp->dirdta.filename));
  107.     dirp->dirent.d_namlen = strlen(dirp->dirent.d_name);
  108.     dirp->dirent.d_reclen = sizeof(struct direct) - (MAXNAMLEN + 1) +
  109.         ((((dirp->dirent.d_namlen + 1) + 3) / 4) * 4);
  110.  
  111.     return &(dirp->dirent);
  112.  
  113. } /*readdir*/
  114.  
  115.  
  116. /*
  117.    Close a directory
  118. */
  119.  
  120. void closedir(dirp)
  121. DIR *dirp;
  122. {
  123.  
  124.     strcpy(dirp->dirid, "XXX");
  125.     free(dirp);
  126.  
  127. } /*closedir*/
  128.  
  129.